﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace AvisoSuporte
{
    public partial class ProcessarRelatorioDiario : Form
    {
        string resumo_bugs = string.Empty;
        string dataProcessamento = string.Empty;
        string template = string.Empty;
        string template_resumo_total = string.Empty;
        string template_resumo_produto = string.Empty;
        string template_resumo_prioridade = string.Empty;
        string template_resumo_fator_gerador = string.Empty;
        string template_bugs = string.Empty;

        int contador_remedy = 0;

        List<int> EmAndamento = new List<int>();
        List<int> EmFila = new List<int>();
        List<int> Resolvidos = new List<int>();
        List<int> NaoCorrigidos = new List<int>();
        List<int> AbertosDia = new List<int>();
        List<int> Cancelados = new List<int>();
        List<int> PendenciasExternas = new List<int>();

        public ProcessarRelatorioDiario()
        {
            InitializeComponent();
        }

        private void ProcessarRelatorio_Load(object sender, EventArgs e)
        {
            txtData.Text = DateTime.Now.ToString("dd/MM/yyyy");

        }

        private void ProcessDailyReport()
        {
            dataProcessamento = Convert.ToDateTime(txtData.Text).ToString("dd/MM/yyyy");
            //pega os dados dos bugs do dia
            Communication.Geral geral = new AvisoSuporte.Communication.Geral();
            List<Model.WorkItem> bugs = geral.RetornaBugsDia(txtData.Text);

            template_resumo_produto = @"<tr><td>{0}</td><td style='color: Black;'>{1}</td><td style='color: Black;'>{2}</td><td style='color: Black;'>{3}</td><td style='color: Black;'>{4}</td><td style='color: Black;'>{5}</td><td style='color: Black;'>{6}</td><td style='color: Black;'>{7}</td></tr>";
            template_resumo_fator_gerador = @"<tr><td style='color: Black;'>{0}</td><td style='color: Black;'>{1}</td><td style='color: Black;'>{2}</td><td style='color: Black;'>{3}</td><td style='color: Black;'>{4}</td><td style='color: Black;'>{5}</td><td style='color: Black;'>{6}</td></tr>";
            template_resumo_prioridade = @"<tr><td style='color: Black;'>{0}</td><td style='color: Black;'>{1}</td><td style='color: Black;'>{2}</td><td style='color: Black;'>{3}</td><td style='color: Black;'>{4}</td></tr>";

            template_bugs = @"<table class='tabela' cellpadding='4' cellspacing='0'>
                                <tr>
                                    <td style='width:150px; font-weight: bold;'>Produto:
                                    </td>
                                    <td style='color: Black;'>&nbsp;{0}
                                    </td>
                                </tr>
                                <tr>
                                    <td style='width:150px; font-weight: bold;'>Problema:
                                    </td>
                                    <td style='color: Black;'>&nbsp;{1}
                                    </td>
                                </tr>
                                <tr>
                                    <td style='width:150px; font-weight: bold;'>Incidente Remedy:
                                    </td>
                                    <td style='color: Black;'>&nbsp;{2}
                                    </td>
                                </tr>
                                <tr>
                                    <td style='width:150px; font-weight: bold;'>Chamado TFS:
                                    </td>
                                    <td style='color: Black;'>&nbsp;{3}
                                    </td>
                                </tr>
                                <tr>
                                    <td style='width:150px; font-weight: bold;'>Status:
                                    </td>
                                    <td style='color: Black;'>&nbsp;{4}
                                    </td>
                                </tr>
                                <tr>
                                    <td style='width:150px; font-weight: bold;'>Fator Gerador:
                                    </td>
                                    <td style='color: Black;'>&nbsp;{5}
                                    </td>
                                </tr>
                                <tr>
                                    <td style='width:150px; font-weight: bold;'>Prioridade:
                                    </td>
                                    <td style='color: Black;'>&nbsp;{6}
                                    </td>
                                </tr>                                
                                <tr>
                                    <td style='width:150px; font-weight: bold;'>Quando:
                                    </td>
                                    <td style='color: Black;'>&nbsp;{7}
                                    </td>
                                </tr>
                                <tr>
                                    <td style='width:150px; font-weight: bold;'>Fechamento:
                                    </td>
                                    <td style='color: Black;'>&nbsp;{8}
                                    </td>
                                </tr>
                                <tr>
                                    <td style='width:150px; font-weight: bold;'>Abertura:
                                    </td>
                                    <td style='color: Black;'>&nbsp;{9}
                                    </td>
                                </tr>
                                <tr>
                                    <td style='width:150px; font-weight: bold;'>Solução:
                                    </td>
                                    <td style='color: Black;'>&nbsp;{10}
                                    </td>
                                </tr>                               
                                <tr>
                                    <td style='width:150px; font-weight: bold;'>Designado para:
                                    </td>
                                    <td style='color: Black;'>&nbsp;{11}
                                    </td>
                                </tr>
                            </table>";

            template_resumo_total = @"<tr class='header'>
	                                    <td class='tabelaProdutoToolbar'>Total
	                                    </td>		
	                                    <td class='tabelaProdutoToolbar'>{0}
	                                    </td>		
	                                    <td class='tabelaProdutoToolbar'>{1}
	                                    </td>		
	                                    <td class='tabelaProdutoToolbar'>{2}
	                                    </td>		
	                                    <td class='tabelaProdutoToolbar'>{3}
	                                    </td>		
	                                    <td class='tabelaProdutoToolbar'>{4}
	                                    </td>		
	                                    <td class='tabelaProdutoToolbar'>{5}
	                                    </td>		
	                                    <td class='tabelaProdutoToolbar'>{6}
	                                    </td>		
                                    </tr>";

            template = System.IO.File.ReadAllText(@"Template\diario.html", Encoding.Default);

            template = template.Replace("<data></data>", dataProcessamento);
            GeraResumo(template_resumo_produto, template_resumo_prioridade, template_resumo_fator_gerador, bugs);
            template = template.Replace("<incidentes></incidentes>", GeraIncidentes(bugs));
            template = template.Replace("<total_incidentes></total_incidentes>", "<p class='totais_bugs'>Total de Incidentes no Remedy: <b>" + contador_remedy + "</b></p>");
            template = template.Replace("<abertosdia></abertosdia>", GeraBugsTemplate(template_bugs, AbertosDia, bugs, "0"));
            template = template.Replace("<emfila></emfila>", GeraBugsTemplate(template_bugs, EmFila, bugs, "1"));
            template = template.Replace("<emandamento></emandamento>", GeraBugsTemplate(template_bugs, EmAndamento, bugs, "2"));
            template = template.Replace("<bugsresolvidos></bugsresolvidos>", GeraBugsTemplate(template_bugs, Resolvidos, bugs, "3"));
            template = template.Replace("<naocorrigidos></naocorrigidos>", GeraBugsTemplate(template_bugs, NaoCorrigidos, bugs, "4"));
            template = template.Replace("<cancelados></cancelados>", GeraBugsTemplate(template_bugs, Cancelados, bugs, "5"));
            template = template.Replace("<pendenciasexternas></pendenciasexternas>", GeraBugsTemplate(template_bugs, PendenciasExternas, bugs, "6"));
            template = template.Replace("<resumo_total_produto></resumo_total_produto>", template_resumo_total);
            template = template.Replace("<resumo_bugs></resumo_bugs>", resumo_bugs);

            if (!String.IsNullOrEmpty(this.txtObservacoes.Text))
            {
                template = template.Replace("<observacoesLink></observacoesLink>", "<a href='#observacoes' class='link'>Observações</a><br />");
                template = template.Replace("<observacoesContent></observacoesContent>", @"<a id='observacoes' class='titulo'>Observações</a>
                                                                        <div>
                                                                            <br />
                                                                            <p class='observacoes'>
                                                                                <observacoes></observacoes>
                                                                            </p>
                                                                        </div>
                                                                        <a href='#topo' class='topo'>Topo</a>
                                                                        <br />
                                                                        <br />
                                                                        <br />");
                template = template.Replace("<observacoes></observacoes>", txtObservacoes.Text.Replace("\r\n", "<br/>"));
            }

            resumo_bugs = string.Empty;

            if (!System.IO.Directory.Exists(txtCaminho.Text))
            {
                System.IO.Directory.CreateDirectory(txtCaminho.Text);
            }

            System.IO.File.WriteAllText(txtCaminho.Text + "/relatoriosuporte_" + DateTime.Now.ToString("yyyyMMdd") + ".html", template, Encoding.Default);

            DialogResult resultado = MessageBox.Show(this, "Processanto efetuado. Deseja enviar e-mail com o Resumo do dia?", "Processamento Finalizado", MessageBoxButtons.YesNo);

            if (resultado == DialogResult.Yes)
            {
                //enviar email
                Microsoft.Office.Interop.Outlook.Application oApp = new Microsoft.Office.Interop.Outlook.Application();
                Microsoft.Office.Interop.Outlook.MailItem oMsg = (Microsoft.Office.Interop.Outlook.MailItem)oApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);

                string titulo = string.Empty;
                string corpo = string.Empty;
                string to = string.Empty;
                string email_to = string.Empty;
                string corpo_release = string.Empty;
                string to_release = string.Empty;

                titulo = "Relatório do Dia - " + dataProcessamento;
                corpo += "Anexo Relatório do dia para análise." + Environment.NewLine + Environment.NewLine;
                corpo += "Equipe Suporte CDSB" + Environment.NewLine;

                to = "p-jpontes@bvmf.com.br;p-mprudente@bvmf.com.br;p-cagoncalves@bvmf.com.br";

                oMsg.Subject = titulo;
                oMsg.To = to;
                oMsg.Body = corpo;
                oMsg.Importance = Microsoft.Office.Interop.Outlook.OlImportance.olImportanceNormal;
                oMsg.Attachments.Add(txtCaminho.Text + "/relatoriosuporte_" + DateTime.Now.ToString("yyyyMMdd") + ".html", Microsoft.Office.Interop.Outlook.OlAttachmentType.olByValue, 1, "");
                ((Microsoft.Office.Interop.Outlook._MailItem)oMsg).Send();
            }
        }

        private string GeraIncidentes(List<Model.WorkItem> bugs)
        {
            //pega os incidentes do remedy

            Remedy remedy = new Remedy();

            string tabela = "<table class='tabela' cellpadding='4' cellspacing='0'>";
            tabela += "<tr class='header'><td>Incidente</td><td>Cliente</td><td>Descrição</td><td>Desde</td><td>Bug Atrelado</td></tr>";
            contador_remedy = 0;
            foreach (AvisoSuporte.remedyWS.GetListOutputMapGetListValues item in remedy.getIncidentsWS(@" ('Assigned Group' = ""DO-CDSB-SUPORTE-CODIFICACAO"" or 'Assigned Group' = ""DO-DSE-SUPORTE NIVEL 3"")"))
            {
                if (item.Status != AvisoSuporte.remedyWS.StatusType.Closed
                    && item.Status != AvisoSuporte.remedyWS.StatusType.Cancelled
                    && item.Status != AvisoSuporte.remedyWS.StatusType.Resolved)
                {

                    //verifica existencia de bug na lista
                    bool find = false;

                    foreach (Model.WorkItem wi in bugs)
                        if (item.Incident_Number.IndexOf(wi.Remedy.ToString()) > 0)
                            find = true;

                    tabela += string.Format("<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>{3}</td><td>{4}</td></tr>",
                        item.Incident_Number, item.Company, item.Description, Convert.ToDateTime(item.Submit_Date).ToString("dd/MM/yyyy"), ((find) ? "Sim" : "Não"));
                    contador_remedy++;
                }
            }

            tabela += "</table>";
            return tabela;
        }

        private string GeraBugsTemplate(string template_bugs, List<int> ids, List<Model.WorkItem> bugs, string texto)
        {
            string ret = string.Empty;
            int count = 0;
            foreach (Model.WorkItem item in bugs)
            {
                if (ids.Contains(item.ID))
                {
                    ret += string.Format(template_bugs, item.TeamProject, item.Title, item.Remedy, item.ID, item.State, (String.IsNullOrEmpty(item.FatorGerador) ? "-" : item.FatorGerador), item.Rank, item.CreatedDate.ToString("dd/MM/yyyy"), (item.FinishDateRealized == DateTime.MinValue) ? "-" : item.FinishDateRealized.ToString("dd/MM/yyyy"), item.CreatedBy, (item.CorrigidoPor == null) ? item.AssignedTo : item.CorrigidoPor, item.AssignedTo);
                    count++;
                }
            }

            //resumo_bugs += "Total de Bugs " + texto + ":&nbsp;&nbsp;<b>" + count + "</b><br/><br/>";

            template_resumo_total = template_resumo_total.Replace("{" + texto + "}", count.ToString());

            return ret;
        }

        private void GeraResumo(string template_resumo_produto, string template_resumo_prioridade, string template_resumo_fator_gerador, List<Model.WorkItem> bugs)
        {
            List<Model.CountStatus> teamProjects = new List<Model.CountStatus>();
            Model.CountPriority countPriority = new Model.CountPriority();
            Model.CountFatorGerador countFatorGerador = new Model.CountFatorGerador();
            string temp = string.Empty;

            foreach (Model.WorkItem wi in bugs)
            {
                bool find = false;
                foreach (Model.CountStatus countStatus in teamProjects)
                {
                    if (countStatus.TeamProject == wi.TeamProject)
                    {
                        find = true;
                        ContaBug(wi, countStatus);                        
                        break;
                    }
                }

                if (!find)
                {
                    Model.CountStatus countStatus = new Model.CountStatus();
                    countStatus.TeamProject = wi.TeamProject;
                    ContaBug(wi, countStatus);
                    teamProjects.Add(countStatus);
                }

                ContaPrioridade(wi, countPriority);
                ContaFatorGerador(wi, countFatorGerador);
            }

            foreach (Model.CountStatus teamProject in teamProjects)
            {
                temp += string.Format(template_resumo_produto, teamProject.TeamProject, teamProject.AbertosDia, teamProject.EmFila, teamProject.EmAndamento, teamProject.Resolvido, teamProject.NaoCorrigido, teamProject.Cancelado, teamProject.PendenciasExternas);
            }

            template = template.Replace("<resumo_produto></resumo_produto>", temp);
            template = template.Replace("<resumo_prioridade></resumo_prioridade>", string.Format(template_resumo_prioridade, countPriority.Imediato, countPriority.Urgente, countPriority.Alta, countPriority.Normal, countPriority.Baixa));
            template = template.Replace("<resumo_fator_gerador></resumo_fator_gerador>", string.Format(template_resumo_fator_gerador, countFatorGerador.Arquitetura, countFatorGerador.Desenvolvimento, countFatorGerador.InfraEstrutura, countFatorGerador.Negocio, countFatorGerador.ReleaseManager, countFatorGerador.UX, countFatorGerador.Indeterminado));
        }

        private void ContaFatorGerador(Model.WorkItem wi, Model.CountFatorGerador countFatorGerador)
        {
            //verifica se é Arquitetura
            if (wi.FatorGerador.Equals("Arquitetura"))
            {
                countFatorGerador.Arquitetura++;
            }

            //verifica se é Desenvolvimento
            if (wi.FatorGerador.Equals("Desenvolvimento"))
            {
                countFatorGerador.Desenvolvimento++;
            }

            //verifica se é Infra Estrutura
            if (wi.FatorGerador.Equals("Infra Estrutura"))
            {
                countFatorGerador.InfraEstrutura++;
            }

            //verifica se é Negócio
            if (wi.FatorGerador.Equals("Negócio"))
            {
                countFatorGerador.Negocio++;
            }

            //verifica se é Release Manager
            if (wi.FatorGerador.Equals("Release Manager"))
            {
                countFatorGerador.ReleaseManager++;
            }

            //verifica se é UX
            if (wi.FatorGerador.Equals("UX"))
            {
                countFatorGerador.UX++;
            }

            //verifica se é UX
            if (wi.FatorGerador.Equals(""))
            {
                countFatorGerador.Indeterminado++;
            }
        }

        private void ContaPrioridade(Model.WorkItem wi, Model.CountPriority countPriority)
        {
            //verifica se é Imediato
            if (wi.Rank.Equals("Imediato"))
            {
                countPriority.Imediato++;
            }

            //verifica se é Urgente
            if (wi.Rank.Equals("Urgente"))
            {
                countPriority.Urgente++;
            }

            //verifica se é Alta
            if (wi.Rank.Equals("Alta"))
            {
                countPriority.Alta++;
            }

            //verifica se é Normal
            if (wi.Rank.Equals("Normal"))
            {
                countPriority.Normal++;
            }

            //verifica se é Baixa
            if (wi.Rank.Equals("Baixa"))
            {
                countPriority.Baixa++;
            }
        }

        private void ContaBug(Model.WorkItem wi, Model.CountStatus countStatus)
        {
            //verifica se é retorno
            if (wi.NaoCorrigido && wi.DataNaoCorrigido.ToString("dd/MM/yyyy") == dataProcessamento)
            {
                countStatus.NaoCorrigido++;
                NaoCorrigidos.Add(wi.ID);
            }

            if (wi.State == "Cancelado" && wi.DataCancelamento.ToString("dd/MM/yyyy") == dataProcessamento)
            {
                countStatus.Cancelado++;
                Cancelados.Add(wi.ID);
            }

            if (wi.State == "Ativo")
            {
                countStatus.EmFila++;
                EmFila.Add(wi.ID);
            }

            if (wi.State == "Analise" ||
                wi.State == "Codificacao" ||
                wi.State == "Codificado")
            {
                countStatus.EmAndamento++;
                EmAndamento.Add(wi.ID);
            }
            if (wi.FinishDateRealized.ToString("dd/MM/yyyy") == dataProcessamento)
            {
                countStatus.Resolvido++;
                Resolvidos.Add(wi.ID);
            }

            if (wi.StartDate.ToString("dd/MM/yyyy") == dataProcessamento)
            {
                countStatus.AbertosDia++;
                AbertosDia.Add(wi.ID);
            }

            if (wi.PendenciaExterna)
            {
                countStatus.PendenciasExternas++;
                PendenciasExternas.Add(wi.ID);
            }            
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            folderBrowserDialog.ShowDialog(this);
            txtCaminho.Text = folderBrowserDialog.SelectedPath;
        }

        private void btnProcessar_Click(object sender, EventArgs e)
        {
            this.ProcessDailyReport();
        }
    }
}
